package main

/*
* Content: 多态
* --------------------------------------------------
* Go语言基础19 接口interface: https://www.bilibili.com/video/BV1Gt411F7uE
 */

import "fmt"

type dog struct{}

func (d dog) say() {
	fmt.Println("汪汪汪~")
}

type cat struct{}

func (c cat) say() {
	fmt.Println("喵喵喵~")
}

type person struct {
	name string
}

func (p person) say() {
	fmt.Println(p.name, ":轻一点~")
}

// 接口不管你是什么类型，只管你要实现的方法
// 不管是什么类型, 只要实现了 say() 这个方法的类型，都可以成为 animal 类型
type animal interface {
	say()
}

// 动物受到攻击，就会叫出声音
func attack(an animal) {
	an.say()
}

func MyInterfaceObject() {

	// 多态
	fmt.Println("--------------------多态--------------------")

	c1 := cat{}
	// 攻击小猫
	attack(c1)

	d1 := dog{}
	// 攻击小狗
	attack(d1)

	p1 := person{
		name: "谢清照",
	}
	attack(p1)

	var ani animal
	c2 := cat{}
	ani = c2
	fmt.Printf("ani接口中保存的是: %v\n", ani)

	p2 := person{name: "信鸽"}
	ani = p2
	fmt.Printf("ani接口中保存的是: %v\n", ani)
}
